package com.qf.zyh.web.controller;

import com.qf.zyh.common.Const;
import com.qf.zyh.util.StrUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取method的值

        String method = req.getParameter("method");
        //验证字符串是否为空。全为空为true，！取反使其为空则false
        if (!StrUtils.empty(method)) {
            //为空则转发到首页。
            resp.sendRedirect(req.getContextPath()+"/index.jsp");
            return;
        }
        //不为空则下一步：
        try {//这是父类，是被调用的，这个this是指谁调就是谁。this。class就是谁调的谁的对象
            //this是父类的this，this。getclass是调用父类方法的子类实例对象。
            Class<? extends BaseServlet> aClass = this.getClass();
            //通过方法名和参数来找到对应的方法。（不是子类的方法）方法名就是上面获得的method则get这个的方法
            //参数第一个为获取到的method，第二个是req类对象和resp类对象。
            Method method1 = aClass.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            //反射调用子类的目标方法
            //invoke是对带有指定参数的指定对象调用method对象的方法。参数为对象，req，resp。
            String invoke = (String) method1.invoke(this, req, resp);
            if (invoke!=null) {
                //startsWith方法是设置开头为xxx
                //在不为空的情况下，forward就是转发，将两者加入到Const常量中。
                if (invoke.startsWith(Const.SysConst.FORWARD)){
                    //indexof方法是获得字符的下标位置，冒号位置+1则从冒号后方开始获取字符串。
                    req.getRequestDispatcher(invoke.substring(invoke.indexOf(":")+1)).forward(req,resp);
                    //redirect就是重定向
                }else if (invoke.startsWith(Const.SysConst.REDIRECT)){
                    resp.sendRedirect(req.getContextPath()+"/"+invoke.substring(invoke.indexOf(":")+1));
                }else {
                    PrintWriter writer = resp.getWriter();
                    //写出字符串然后关闭
                    writer.write(invoke);
                    writer.flush();
                    writer.close();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            resp.sendRedirect(req.getContextPath()+"/error404.jsp");
        }
    }
}
